/*
 * CPF.java
 * Versão: 1.0
 * Data de Criação : 22/08/2011
 * Copyright (c) 2008-2011 Universidade Estadual de
 * Londrina - UEL.
 * Rodovia Celso Garcia Cid, Cidade Universitária,
 * Londrina, Paraná
 * Brasil
 * Todos os direitos reservados.
 *
 * Este software é de informação confidenciais de
 * propriedade da UEL Univesidade Estadual de Londrina.
 * ("Informações Confidenciais "). Você não poderá
 * compartilhar estas informações por ser de carater
 * confidencial e usará somente em acordo com os termos de
 * licençada UEL
 */
package br.uel.ati.validacao;

/**
 * Esta classe contém os métodos estáticos que validam um cpf. Para utilizá-la,
 * além de fazer o import de "br.uel.ati.validacao.CPF", é necessário apenas
 * chamá-la como no exemplo:
 * 
 * CPF.validar("00000000000");
 * 
 * Portanto a instanciação desta classe não é necessária.
 *
 * @author Humberto Ferreira da Luz Junior
 * @version 1.0
 */
public class CPF {

    /**
     * Único método publico da classe, é ele que deve ser chamado para realizar
     * a validação.
     *
     * @param cpf, O CPF que deve ser validado.
     * @return Valor booleano que assume o valor "true" caso o CPF seja válido
     * e "false" caso seja inválido.
     */
    public static boolean validar(String cpf) {
        if (cpf.length() != 11) {
            return false;
        }

        String numDig = cpf.substring(0, 9);
        return calcDigVerif(numDig).equals(cpf.substring(9, 11));
    }

    /**
     * Método que calcula o digito verificador do CPF.
     *
     * @param num, O CPF que deve ser validado.
     * @return Valor do digito verificador, que deve ser igual aos 2 últimos
     * digitos do CPF.
     */
    private static String calcDigVerif(String num) {
        Integer primDig, segDig;
        int soma = 0, peso = 10;
        for (int i = 0; i < num.length(); i++) {
            soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
        }

        if (soma % 11 == 0 | soma % 11 == 1) {
            primDig = new Integer(0);
        } else {
            primDig = new Integer(11 - (soma % 11));
        }

        soma = 0;
        peso = 11;
        for (int i = 0; i < num.length(); i++) {
            soma += Integer.parseInt(num.substring(i, i + 1)) * peso--;
        }

        soma += primDig.intValue() * 2;
        if (soma % 11 == 0 | soma % 11 == 1) {
            segDig = new Integer(0);
        } else {
            segDig = new Integer(11 - (soma % 11));
        }

        return primDig.toString() + segDig.toString();
    }

    /**
     * Método que calcula o segundo digito verificador do CPF.
     *
     * @param cpf, O CPF que deve ser validado.
     * @param primDig, O primeiro digito verificador já calculado.
     * @return Segundo digito verificador.
     */
    private static int calcSegDig(String cpf, int primDig) {
        int soma = 0, peso = 11;
        for (int i = 0; i < cpf.length(); i++) {
            soma += Integer.parseInt(cpf.substring(i, i + 1)) * peso--;
        }

        soma += primDig * 2;
        if (soma % 11 == 0 | soma % 11 == 1) {
            return 0;
        } else {
            return 11 - (soma % 11);
        }
    }
}
